Modern storage systems can be built out of discrete components, called nodes, that are interconnected with a network, such as a TCP/IP network. Each node is typically a fully functional computer with CPUs, storage, memory, etc. The collection of nodes is sometimes called a federation, or peer-to-peer network, meaning all nodes are equal (i.e., there is no central management authority and no node is privileged). As equal peers, the nodes communicate among themselves to resolve state. Building a federated storage system can provide a more resilient and scalable storage solution, as nodes can be incrementally added for performance and/or capacity, and if one node fails, the federation still works.
What distinguishes a federation from just a collection of computers is that nodes in the federation communicate with each other regarding the underlying data storage, health of each node, etc. Specifically, nodes in the federation may copy and exchange information for purposes of performance and data integrity. This information may be in the form of data objects, or files, where an object may be a portion of a file.
As objects are propagated through the federation, data structures are required to: a) know where the objects are; and b) know when the objects are no longer needed. In prior art systems where objects have reference counts, i.e., the number of times an object is referenced by another object, an object may be safely de-allocated or deleted (e.g., garbage collection) when its reference count drops to zero.
However, keeping track of reference counts for billions of objects, when millions of objects are being passed around per second, results in unacceptable network traffic and CPU costs if simplistic algorithms are used.
Another challenge is determining that the reference count is actually zero, and then finding all object instances so they can be deleted. There is an ongoing need for more efficient and reliable protocols for tracking objects to overcome these problems.